package com.bfsoft.springbootinit.util;

import lombok.extern.slf4j.Slf4j;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Base64;

@Slf4j
public class DESUtil {

    private final static String key = "ZYYSYMXT";

    /**
     * 使用DES算法对加密后的密文进行解密
     *
     * @param encryptedMessage 加密后的密文，通常是Base64编码后的字符串（与加密时的输出格式对应）
     * @return 解密后的原始明文消息，如果解密过程出现异常则返回null
     * @throws NoSuchAlgorithmException    如果指定的加密算法不存在时抛出
     * @throws InvalidKeySpecException    如果密钥规范无效时抛出
     */
    public static String decryptByDES(String encryptedMessage) throws NoSuchAlgorithmException, InvalidKeySpecException {
        try {
            // 将密钥转换为符合DES算法要求的密钥规范对象
            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

            // 创建密码器，指定DES解密算法、ECB模式以及PKCS5Padding填充方式（Java中PKCS5Padding等同于Pkcs7填充对于8字节分组的情况）
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);

            // 对Base64编码的加密消息进行解码，得到加密后的字节数组
            byte[] encryptedBytes = Base64.getDecoder().decode(encryptedMessage);

            // 执行解密操作，得到解密后的字节数组
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);

            // 将解密后的字节数组转换为字符串，返回原始明文消息
            return new String(decryptedBytes);
        } catch (Exception e) {
            log.error("解密失败",e);
            return null;
        }
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
        String SALT="biekanwozhishiyizhiyang";
        System.out.println("密码 " + MD5Util.MD5Encode(MD5Util.MD5Encode(123456+SALT)));
    }
}
